<?php
require_once 'PHPUnit/Framework.php';
require_once "amicitia/conf/Conf.class.php";
require_once 'amicitia/arquitectura/Cargador.class.php';
def("amicitia/persistencia/daos/","ConexionBD");
def("amicitia/persistencia/daos/","FabricaDao");
def("amicitia/modelo/entidades/","Persona");

/**
 * Prueba todo lo concerniente al DaoPersona.
 *
 * @author Willy A. Kuster
 */
class PruebaDaoPersona extends PHPUnit_Framework_TestCase {

	private $daoPersona;

	/**
	 * Realiza la conexión a la base de datos y crea una instancia de
	 * DaoPersona.
	 */
	protected function setUp() {
		ConexionBD::getConexionBD()->conectar();
		$fabricaDao = FabricaDao::obtenerFabrica();
		$this->daoPersona = $fabricaDao->obtenerDaoPersona();
	}

	/**
	 * Prueba la obtención de una persona.
	 */
	public function testObtenerPersona() {
		$id = 10;
		
		$personaEsperada = new Persona();
		$personaEsperada->setId($id);
		$personaEsperada->setAlias("willykc");
		$personaEsperada->setPassword("332caee2c3b1786392e8cf5f046f115edb206078");
		$personaEsperada->setNombre("Willy");
		$personaEsperada->setApellido("Kuster");
		$personaEsperada->setEmail("willykc@gmail.com");
		$personaEsperada->setSexo("m");
		
		$persona = $this->daoPersona->obtenerPersona($id);
		$this->assertEquals($personaEsperada, $persona);
	}
	
	/**
	 * Prueba la autenticación de una persona.
	 */
	public function testAutenticarPersona() {
		$idEsperado = 10;
		
		$idObtenido = $this->daoPersona->autenticarPersona("willykc","willykc");
		$this->assertEquals($idEsperado, $idObtenido);
	}
	
	/**
	 * Prueba el caso en el que se pase un id que no tiene un registro asociado
	 * en la base de datos.
	 */
	public function testObtenerPersonaNoExistente() {
		$persona = $this->daoPersona->obtenerPersona(0);
		$this->assertEquals(NULL, $persona);
	}
	
	/**
	 * Prueba el guardado de una persona en la base de datos.
	 */
	public function testGuardarPersona() {
		$persona = new Persona();
		$persona->setAlias("alias");
		$persona->setPassword("alias");
		$persona->setNombre("nombre");
		$persona->setApellido("apellido");
		$persona->setEmail("mail@gmail.com");
		$persona->setSexo("m");
		
		$id = $this->daoPersona->guardarPersona($persona);
		
		$personaGuardada = $this->daoPersona->obtenerPersona($id);
		
		$persona->setId($id);
		$persona->setPassword("cdb6fdbe91faa53a7c573c80b7c18108c73c0480");
		
		$this->assertEquals($persona, $personaGuardada);
	}
	
	/**
	 * Prueba el borrado de una persona en la base de datos.
	 */
	public function testEliminarPersona() {
		$persona = new Persona();
		$persona->setAlias("alias");
		$persona->setPassword("alias");
		$persona->setNombre("nombre");
		$persona->setApellido("apellido");
		$persona->setEmail("mail@gmail.com");
		$persona->setSexo("m");
		
		$id = $this->daoPersona->guardarPersona($persona);
		
		$exito = $this->daoPersona->eliminarPersona($id);
		
		$persona = $this->daoPersona->obtenerPersona($id);
		
		$this->assertTrue($exito);
		$this->assertEquals(NULL, $persona);
	}
	
	/**
	 * Deshace todos los cambios y cierra la conexión a la base de datos.
	 */
	protected function tearDown() {
		ConexionBD::getConexionBD()->deshacer();
		ConexionBD::getConexionBD()->desconectar();
	}
	
}
?>